x86: don't crash when mapping a page using EFI runtime page tables
When an interrupt is received during an EFI runtime service call, Xen
may call map_domain_page() while using the EFI runtime page tables.
This fails because, although the EFI runtime page tables are a
copy of the idle domain's page tables, current points at a different
domain's vCPU.
To fix this, return NULL from mapcache_current_vcpu() when using the EFI
runtime page tables which is treated equivalently to running in an idle
vCPU.
This issue can be reproduced by repeatedly calling GetVariable() from
dom0 while using VT-d, since VT-d frequently maps a page from interrupt
context.
Example call trace:
[<
ffff82d0801615dc>] __find_next_zero_bit+0x28/0x60
[<
ffff82d08016a10e>] map_domain_page+0x4c6/0x4eb
[<
ffff82d080156ae6>] map_vtd_domain_page+0xd/0xf
[<
ffff82d08015533a>] msi_msg_read_remap_rte+0xe3/0x1d8
[<
ffff82d08014e516>] iommu_read_msi_from_ire+0x31/0x34
[<
ffff82d08016ff6c>] set_msi_affinity+0x134/0x17a
[<
ffff82d0801737b5>] move_masked_irq+0x5c/0x98
[<
ffff82d080173816>] move_native_irq+0x25/0x36
[<
ffff82d08016ffcb>] ack_nonmaskable_msi_irq+0x19/0x20
[<
ffff82d08016ffdb>] ack_maskable_msi_irq+0x9/0x37
[<
ffff82d080173e8b>] do_IRQ+0x251/0x635
[<
ffff82d080234502>] common_interrupt+0x62/0x70
[<
00000000df7ed2be>]
00000000df7ed2be
Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>